package com.cy.pj.common.web;

import org.apache.shiro.ShiroException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authz.AuthorizationException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import com.cy.pj.common.vo.JsonResult;

/***
 * @ControllerAdvice 注解描述的类.springmvc会认为他是一个控制层全局异常处理对象
 *
 */
@ControllerAdvice
public class GlobalExceptionHandler {
	
	/***
	 * @ExceptionHandler(RuntimeException.class) 注解描述的方法为异常处理方法,
	 * 次注解中定义的异常类型,为这个方法可以处理的异常类型,他可以处理磁异常以及这个异常类型的自类类型的异常
	 * @param e 此参数用于接收具体异常对象,其类型一般与@ExeptionHandler注解中定义异常类型相同或者为其父类
	 * @return 封装了异常信息的独享
	 */
	//JDK中的自带的日志API
	@ExceptionHandler(RuntimeException.class)
	@ResponseBody	//告诉springmvc数据以json格式输出
	public JsonResult RundoHandleRuntimeException(RuntimeException e){
		
		e.printStackTrace();//也可以写日志
		//异常信息
		return new JsonResult(e);//封装
	}
	
	@ExceptionHandler(ShiroException.class) 
	   @ResponseBody
		public JsonResult doHandleShiroException(
				ShiroException e) {
			JsonResult r=new JsonResult();
			r.setState(0);
			if(e instanceof UnknownAccountException) {
				r.setMessage("账户不存在");
			}else if(e instanceof LockedAccountException) {
				r.setMessage("账户已被禁用");
			}else if(e instanceof IncorrectCredentialsException) {
				r.setMessage("密码不正确");
			}else if(e instanceof AuthorizationException) {
				r.setMessage("没有此操作权限");
			}else {
				r.setMessage("系统维护中");
			}
			e.printStackTrace();
			return r;
		}


}
